#lang autolisp

(require "rosetta")
(require "racket")
(backend rhino)

(defun atomium (re l rc / p0 p1 p2 p3 p4 p5 p6 p7 p8 pts0 pts1)
  (setq p0 (xyz 0 0 0)
        p1 (xyz (- l) (- l) (- l))
        p2 (xyz (+ l) (- l) (- l))
        p3 (xyz (+ l) (+ l) (- l))
        p4 (xyz (- l) (+ l) (- l))
        p5 (xyz (- l) (- l) (+ l))
        p6 (xyz (+ l) (- l) (+ l))
        p7 (xyz (+ l) (+ l) (+ l))
        p8 (xyz (- l) (+ l) (+ l))
        pts0 (list p1 p2 p3 p4)
        pts1 (list p5 p6 p7 p8))
  (list (mapcar '(lambda (p) (move p (sphere re)))
                (cons p0 (append pts0 pts1)))
        (mapcar '(lambda (pa pb) (cylinder-pp rc pa pb))
                pts0
                (cdr (append pts0 pts0)))
        (mapcar '(lambda (pa pb) (cylinder-pp rc pa pb))
                pts1
                (cdr (append pts1 pts1)))
        (mapcar '(lambda (pa pb) (cylinder-pp rc pa pb))
                pts0
                pts1)
        (mapcar '(lambda (pa pb)
                   (list (cylinder-pp rc pa p0)
                         (cylinder-pp rc p0 pb)))
                pts0
                (cddr (append pts1 pts1)))))

(map (cλ rotate-pp uz uxyz) (flatten (atomium 9 32 1.5)))